Pager部分与PCache部分紧密相连,虽然我本次分到的代码并未包含PCache,但是还是简单介绍一下。 SQLite将页内存分配系统实现为两层: 1、PCache结构为页内存分配系统的上层接口结构,与具体的实现无关。 2、用户定义缓冲区模块,PCache1结构为页内存分配系统的默认实现,直接对页空间的分配与回收,上层使用者无需关心其内部实现。 Pcache.c这个文件实现的是页面缓存。 一个完整的页面缓存是这种结构的一个实例。
struct PCache { PgHdr pDirty, pDirtyTail; / 按LRU顺序的脏数据页列表 / PgHdr pSynced; / 在脏数据列表中最后同步的页/ int nRef; / 引用页的数量 / int szCache; / 配置的缓存的大小 / int szPage; / 缓存中每个页的大小 / int szExtra; / 每个页面的额外空间大小 / int bPurgeable; / 如果页面是在后备存储器则为真 / int (xStress)(void,PgHdr); / Call to try make a page clean / void pStress; / xStress的参数 / sqlite3_pcache pCache; / Pluggable cache module / PgHdr pPage1; / 指向第一页的指针 / };涉及到关于Cache的函数: 1.sqlite3PagerClearCache() 除非这是一个内存或者临时数据库,清除页面缓存 2.sqlite3PagerCacheStat() 参数eStat一定是SQLITE_DBSTATUS_CACHE_HIT或者SQLITE_DBSTATUS_CACHE_MISS。在返回之前,pnVal是通过当前缓存命中或者未命中计数来增加,通过eStat的值。如果重置参数是非零,缓存命中或者未命中在返回前都是0. 3.sqlite3PagerSetCachesize() 改变所允许的内存页面的最大页数